%include "macros.asm"
%define src [ebp + 8]
%define dst [ebp + 12]
%define ancho [ebp + 16]
%define alto [ebp + 20]
%define paso [ebp + 24]


global asmPrewitt

section .text
asmPrewitt:

	C_pushs 0
	mov esi, src 		;movemos el puntero al comienzo de la matriz SRC a ESI
	mov edi, dst 		;movemos el puntero al comiendo de la matriz DST a EDI
	
	mov eax,paso 		;muevo a eax el ancho con basura y todo
	mov edx,alto 		;muevo a edx el alto
	
	mul edx				;en eax dejo guardado el ancho por el alto
	mov ecx,eax 		;ahora lo muevo a ECX para hacer un loop que vaya hasta el final
	mov edx,paso		;dejo el paso en edx
	sub ecx,edx 		;las ultimas 2 lineas no van a ser recorridas
	sub ecx,edx 		
		
ciclo:
	
	inc esi		 			;avanzo una posicion en la primer matriz 
	inc edi					;avanzo una posicion en la segunda matriz
	
	;pasada por x	
	
	xor ebx,ebx					;ebx es donde voy a almacenar el dato a poner.. 
	xor eax,eax					;eax va a ser el contendor de cada pixel de origen
	
	mov al,[esi -1]				
	sub ebx,eax					;sumo al acumulador (-1 * [esi-1])
	
	mov al,[esi+1]				
	add ebx,eax					;sumo al acumulador (1 * [esi+1])
	
	mov al,[esi+edx-1]			;sumo al acumulador (-1 * [esi + edx -1])
	sub ebx,eax
	
	mov al,[esi+edx+1]			;sumo al acumulador (1 * [esi + edx +1])
	add ebx,eax	

	mov al,[esi+edx*2 -1]		;sumo al acumulador (-1 * [esi + edx*2 -1])
	sub ebx,eax
	
	mov al,[esi+edx*2+1]		;sumo al acumulador (1 * [esi + edx*2 + 1])
	add ebx,eax
	
	saturar ebx					;saturo el resultado parcial al aplicar en X
	
	push ebx					;guardo ese resultado saturado


;lo mismo en Y:

	mov al,[esi -1]
	sub ebx,eax
	
	mov al,[esi]
	sub ebx,eax
	
	mov al,[esi+1]
	sub ebx,eax
	
	mov al,[esi+edx*2 -1]
	add ebx,eax
	
	mov al,[esi+edx*2]
	add ebx,eax
	
	mov al,[esi+edx*2+1]
	add ebx,eax
	

	saturar ebx				;saturo el resultado de aplicar el metodo en Y.
	pop eax					;obtengo el valor que habia guardado y lo dejo en EAX
	
	add ebx,eax				;sumo los valores y luego vuelvo a saturar
	saturar ebx
		 
	mov [edi + edx],bl 		;guardo en el pixel de dst, el valor del pixel que acumule
	
	dec ecx
	cmp ecx,0
	jg ciclo 				;cuando ecx osea el ancho por el alto menos las dos filas que saque 
							;lleguen a cero termino, mientras tanto sigo procesando
	mov eax, dst
	mov ebx, alto
	rellenarBordes eax, edx, ebx

	C_pops 0	
	ret
	
